/**
 * 文件名：@HttpResult.java <br/>
 * 包名：cn.efunbox.afw.web.entity <br/>
 * 项目名：afw-web <br/>
 * @author xtwin <br/>
 */
package cn.efunbox.afw.web.entity;

import java.util.Collections;
import java.util.Map;

import org.springframework.http.HttpStatus;

/**
 * 类名：HttpResult  <br />
 *
 * 功能：面向http的结果对象，当需要特殊定制响应结果时，可以使用该结果对象
 *
 * @author xtwin <br />
 * 创建时间：2016年8月2日 下午3:11:17  <br />
 * @version 2016年8月2日
 */
public class HttpResult<T> {

	// http状态吗
	private Integer status;

	// 响应体
	private T body;

	// 响应头
	private Map<String, String> headers;

	// 异常信息
	private Exception exception;

	/**
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年8月2日 下午3:24:46 <br/>
	 */
	public static final <T> HttpResult<T> of() {
		return of(null, HttpStatus.OK, null, null);
	}

	/**
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年8月2日 下午3:24:40 <br/>
	 */
	public static final <T> HttpResult<T> of(Exception e) {
		return of(null, (Integer) null, null, e);
	}

	/**
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年8月2日 下午3:24:50 <br/>
	 */
	public static final <T> HttpResult<T> of(HttpStatus status) {
		return of(null, status, null, null);
	}
	
	/**
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年8月25日 下午3:23:14 <br/>
	 */
	public static final <T> HttpResult<T> of(Integer status) {
		return of(null, status, null, null);
	}

	/**
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年8月2日 下午3:22:23 <br/>
	 */
	public static final <T> HttpResult<T> of(T body) {
		return of(body, HttpStatus.OK, null, null);
	}

	/**
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年8月2日 下午3:22:18 <br/>
	 */
	public static final <T> HttpResult<T> of(T body, HttpStatus status) {
		return of(body, status, null, null);
	}
	
	/**
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年8月25日 下午3:23:34 <br/>
	 */
	public static final <T> HttpResult<T> of(T body, Integer status) {
		return of(body, status, null, null);
	}
	
	/**
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年8月2日 下午3:21:18 <br/>
	 */
	public static final <T> HttpResult<T> of(T body, HttpStatus status, Map<String, String> headers) {
		return of(body, status, headers, null);
	}
	
	/**
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年8月25日 下午3:23:51 <br/>
	 */
	public static final <T> HttpResult<T> of(T body, Integer status, Map<String, String> headers) {
		return of(body, status, headers, null);
	}
	
	/**
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年8月2日 下午3:20:35 <br/>
	 */
	public static final <T> HttpResult<T> of(T body, HttpStatus status, Map<String, String> headers, Exception exception) {
		return new HttpResult<T>(body, null == status ? HttpStatus.OK.value() : status.value(), headers, exception);
	}
	
	/**
	 * 功能： <br/>
	 *
	 * @author xtwin <br/>
	 * @version 2016年8月25日 下午3:24:04 <br/>
	 */
	public static final <T> HttpResult<T> of(T body, Integer status, Map<String, String> headers, Exception exception) {
		return new HttpResult<T>(body, status, headers, exception);
	}

	/**
	 * 构造方法
	 */
	protected HttpResult(T body, Integer status, Map<String, String> headers, Exception exception) {
		this.status = status;
		this.body = body;
		this.headers = null == headers ? Collections.emptyMap() : headers;
		this.exception = exception;
	}

	/**
	 * @version 2016年8月2日-下午3:18:24
	 */
	public Integer getStatus() {
		return status;
	}

	/**
	 * @version 2016年8月2日-下午3:18:24
	 */
	public T getBody() {
		return body;
	}

	/**
	 * @version 2016年8月2日-下午3:18:24
	 */
	public Map<String, String> getHeaders() {
		return headers;
	}

	/**
	 * @version 2016年8月2日-下午3:18:24
	 */
	public Exception getException() {
		return exception;
	}
}
